﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Collections.ObjectModel;

namespace produccion.modelo
{
    public class MConsultaFacturas : ObservableObject
    {

        #region Encabezado

        public class Encabezado : ObservableObject
        {
            private MDOgeneral _mod = new MDOgeneral();

            #region Propiedades

            private string _strFactura;
            public string strFactura
            {
                get { return _strFactura; }
                set { _strFactura = value; }
            }

            private string _strCliente;
            public string strCliente
            {
                get { return _strCliente; }
                set { _strCliente = value; }
            }

            private DateTime _dtmFecha;
            public DateTime dtmFecha
            {
                get { return _dtmFecha; }
                set { _dtmFecha = value; }
            }

            private DateTime _dtmFechaVencimiento;
            public DateTime dtmFechaVencimiento
            {
                get { return _dtmFechaVencimiento; }
                set { _dtmFechaVencimiento = value; }
            }

            private double _numValor;
            public double numValor
            {
                get { return _numValor; }
                set { _numValor = value; }
            }

            private Int32 _numIva;
            public Int32 numIva
            {
                get { return _numIva; }
                set { _numIva = value; }
            }

            private Int32 _numRetencion;
            public Int32 numRetencion
            {
                get { return _numRetencion; }
                set { _numRetencion = value; }
            }

            private double _numDescuento;
            public double numDescuento
            {
                get { return _numDescuento; }
                set { _numDescuento = value; }
            }

            private double _numAbono;
            public double numAbono
            {
                get { return _numAbono; }
                set { _numAbono = value; }
            }

            private string _strConcepto;
            public string strConcepto
            {
                get { return _strConcepto; }
                set { _strConcepto = value; }
            }

            private string _strEstado;
            public string strEstado
            {
                get { return _strEstado; }
                set { _strEstado = value; }
            }

            private double _numFlete;
            public double numFlete
            {
                get { return _numFlete; }
                set { _numFlete = value; }
            }

            private string _strTipo;
            public string strTipo
            {
                get { return _strTipo; }
                set { _strTipo = value; }
            }

            private string _strEmpresa;
            public string strEmpresa
            {
                get { return _strEmpresa; }
                set { _strEmpresa = value; }
            }

            private string _strDetalle;
            public string strDetalle
            {
                get { return _strDetalle; }
                set { _strDetalle = value; }
            }

            private Boolean _logSeleccionado;
            public Boolean logSeleccionado
            {
                get { return _logSeleccionado; }
                set { _logSeleccionado = value; }
            }

            #endregion

            #region Metodos

            public List<MConsultaFacturas.Encabezado> consultar(string strCliente, DateTime dtmFecha, DateTime dtmFechaVence, string strFactura)
            {
                try
                {
                    string strCondicion1 = "";
                    string strCondicion2 = "";

                    if (strCliente == "ZZZ")
                        strCondicion1 = " where 1=1 ";
                    else
                    {
                        if (strCliente == "")
                            strCondicion1 = " where 1=1 ";
                        else
                            strCondicion1 = " where a.codcli_efa  = '" + strCliente + "'";
                    }

                    if (String.IsNullOrEmpty(strFactura))
                        strCondicion2 = " and a.FECFAC_EFA  between '" + dtmFecha.ToString("dd/MM/yyy") + "' and '" + dtmFechaVence.ToString("dd/MM/yyyy") + "'";
                    else
                        strCondicion2 = " and a.NROFAC_EFA  = '" + strFactura + "'";

                    string query = "select a.NROFAC_EFA, a.CODCLI_EFA, a.FECFAC_EFA, a.VTOFAC_EFA, a.VALFAC_EFA, a.IVAFAC_EFA, a.RTEFAC_EFA, a.DTOFAC_EFA, a.ABOFAC_EFA, a.CONCEP_EFA || ' - ' || b.NOMCCP_CFC as  CONCEP_EFA, a.ESTADO_EFA, a.FLETE_EFA, a.TIPFAC_EFA, a.EMPRESA_EFA, a.DETALLE_EFA from encfacp a left join ccpfacp b on a.CONCEP_EFA = b.CODCCP_CFC " + strCondicion1 + strCondicion2 + " order by FECFAC_EFA, NROFAC_EFA";
                    DataTable dt = _mod.consulta(query);
                    List<MConsultaFacturas.Encabezado> lista = new List<MConsultaFacturas.Encabezado>();
                    foreach (DataRow dr in dt.Rows)
                    {
                        lista.Add(new MConsultaFacturas.Encabezado
                        {
                            strFactura = dr["NROFAC_EFA"].ToString(),
                            strCliente = dr["CODCLI_EFA"].ToString(),
                            dtmFecha = Convert.ToDateTime(dr["FECFAC_EFA"]).Date,
                            dtmFechaVencimiento = Convert.ToDateTime(dr["VTOFAC_EFA"]).Date,
                            numValor = Convert.ToDouble(dr["VALFAC_EFA"]),
                            numIva = Convert.ToInt32(dr["IVAFAC_EFA"]),
                            numRetencion = Convert.ToInt32(dr["RTEFAC_EFA"]),
                            numDescuento = Convert.ToDouble(dr["DTOFAC_EFA"]),
                            numAbono = Convert.ToDouble(dr["ABOFAC_EFA"]),
                            strConcepto = dr["CONCEP_EFA"].ToString(),
                            strEstado = dr["ESTADO_EFA"].ToString(),
                            numFlete = Convert.ToDouble(dr["FLETE_EFA"]),
                            strTipo = dr["TIPFAC_EFA"].ToString(),
                            strEmpresa = dr["EMPRESA_EFA"].ToString(),
                            strDetalle = dr["DETALLE_EFA"].ToString(),
                            logSeleccionado = false
                        });
                    }
                    return lista;
                }
                catch (Exception ex) { throw ex; }
            }

            #endregion
        }
        #endregion

        #region Detalle

        public class Detalle : ObservableObject
        {
            private MDOgeneral _mod = new MDOgeneral();

            #region Propiedades

            private string _strFactura;
            public string strFactura
            {
                get { return _strFactura; }
                set { _strFactura = value; }
            }

            private Int32 _numConsecutivo;
            public Int32 numConsecutivo
            {
                get { return _numConsecutivo; }
                set { _numConsecutivo = value; }
            }

            private string _strReferencia;
            public string strReferencia
            {
                get { return _strReferencia; }
                set { _strReferencia = value; }
            }

            private string _strNombreReferencia;
            public string strNombreReferencia
            {
                get { return _strNombreReferencia; }
                set { _strNombreReferencia = value; }
            }

            private Int32 _numCantidad;
            public Int32 numCantidad
            {
                get { return _numCantidad; }
                set { _numCantidad = value; }
            }

            private double _numValor;
            public double numValor
            {
                get { return _numValor; }
                set { _numValor = value; }
            }

            private Int32 _numIva;
            public Int32 numIva
            {
                get { return _numIva; }
                set { _numIva = value; }
            }

            private Int32 _numDocumentoReferencia;
            public Int32 numDocumentoReferencia
            {
                get { return _numDocumentoReferencia; }
                set { _numDocumentoReferencia = value; }
            }

            private double _numTotal;
            public double numTotal
            {
                get { return _numTotal; }
                set { _numTotal = value; }
            }

            #endregion

            #region Metodos

            public List<MConsultaFacturas.Detalle> consultar(string strFactura)
            {
                try
                {
                    string query = " select NROFAC_DFA, CONSEC_DFA, CODREF_DFA, NOMREF_DFA, CANREF_DFA, PREREF_DFA, IVAREF_DFA, nvl(DTOREF_DFA,0) as DTOREF_DFA from detfacp where NROFAC_DFA = '" + strFactura + "' ORDER BY NOMREF_DFA ";
                    DataTable dt = _mod.consulta(query);
                    List<MConsultaFacturas.Detalle> lista = new List<MConsultaFacturas.Detalle>();
                    foreach (DataRow dr in dt.Rows)
                    {
                        lista.Add(new MConsultaFacturas.Detalle
                        {
                            strFactura = dr["NROFAC_DFA"].ToString(),
                            numConsecutivo = Convert.ToInt32(dr["CONSEC_DFA"]),
                            strReferencia = dr["CODREF_DFA"].ToString(),
                            strNombreReferencia = dr["NOMREF_DFA"].ToString(),
                            numCantidad = Convert.ToInt32(dr["CANREF_DFA"]),
                            numValor = Convert.ToDouble(dr["PREREF_DFA"]),
                            numIva = Convert.ToInt32(dr["IVAREF_DFA"]),
                            numDocumentoReferencia = dr["DTOREF_DFA"] == null ? 0 : Convert.ToInt32(dr["DTOREF_DFA"]),
                            numTotal = Convert.ToInt32(dr["CANREF_DFA"]) * Convert.ToDouble(dr["PREREF_DFA"])
                        });
                    }
                    return lista;
                }
                catch (Exception ex) { throw ex; }
            }

            #endregion
        }
        #endregion
    }
}
